package com.创建型模式.单例模式;

/**
 *懒汉单例
 */
public class LazySingle {
    /**
     * 保证instance在所有线程中都同步
     *     volatile ，JVM 保证了每次读变量都从内存中读，跳过 CPU cache 这一步
     *     当一个线程修改了这个变量的值，
     *      volatile 保证了新值能立即同步到主内存，
     *      以及每次使用前立即从主内存刷新
     */
    public static volatile LazySingle instance = null;

    /**
     * 私有构造器，无法从外部实例化
     */
    private LazySingle(){

    }

    /**
     * synchronized 线程同步锁
     * 如果编写的是多线程程序，
     * 则不要删除上例代码中的关键字 volatile 和 synchronized，
     * 否则将存在线程非安全的问题。
     * 如果不删除这两个关键字就能保证线程安全，
     * 但是每次访问时都要同步，会影响性能，
     * 且消耗更多的资源，这是懒汉式单例的缺点。
     * @return
     */
    public static synchronized LazySingle getInstance(){
        if(instance == null){
            instance = new LazySingle();
        }
        return instance;
    }
}

